package com.lbc.cas;

import java.util.concurrent.atomic.AtomicInteger;

public class CASDemo {

    //  CAS  compareAndSwap : 比较并交换！
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(2020);

        //  期望、更新
        //  public final boolean compareAndSet(int expect, int update)
        //  如果我期望的值达到了，那么就更新，反之则反  CAS 是CPU的并发原语！ 用到了 unsafe 类
        //  如果不是期望值那就一直循环 do while 自旋锁
        System.out.println(atomicInteger.compareAndSet(2020, 2021));  //  true
        System.out.println(atomicInteger.get());    //  2021

        //  unsafe类 :  Java无法直接操作内存
        //              Java 可以调用c++ native
        //              c++ 可以操作内存
        //              unsafe类相当于java的后门，可以通过这个类操作内存（也难怪叫不安全）

        System.out.println(atomicInteger.compareAndSet(2020, 2022));  //  false
        System.out.println(atomicInteger.get());    //  2021

//        atomicInteger.getAndIncrement();  分析下 +1
//        public final int getAndIncrement() {
//            return unsafe.getAndAddInt(this, valueOffset, 1);
//        }

//        public final int getAndAddInt(Object var1, long var2, int var4) {
//            int var5;
//            do {
//                var5 = this.getIntVolatile(var1, var2);
//            } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
//  do  while  自旋锁
//            return var5;
//        }
        //  优点：自带原子性
        //  缺点：
        //  1、循环会耗时
        //  2、一次只能保证一个共享变量的原子性
        //  3、ABA问题（狸猫换太子/改了之后又改回来了）
    }
}
